\section{QWidgets}
\subsection{成员函数}
\begin{itemize}
\item Qwidget.size()：获取客户区大小
\item QWidget.width()：获取客户区宽度
\item QWidget.height()：获取客户区高度
\item QWidget.setFixedWidth(width)：使用这个个函数，客户区的高度是固定的，不能改变，只可以改变宽度。
\item QWidget.setFixedWidth(height)：使用这个个函数，客户区的宽度是固定的，不能改变，只可以改变高度。
\item QWidget.setGeometry(int x, int y, int width, int height)：同时改变客户区的大小和位置
\item QWidget.setGeometry(QRect rect)：设置区域有rect指定
\item QWidget.frameGeometry()：获取窗口大小和位置
\item QWidget.move(int x,int y)或者QWidget.move(QPoint,point)设置窗口位置
\item QWidget.pos()：获取窗口左上角的坐标
\end{itemize}
\textbf{QLineEdit}\\
读取和写入：
\begin{itemize}
	\item QLineEdit.text():读取QLinedit中的内容
	\item QLineEdit.setText('string info'):将字符串'string info'写入到QLinedit中
	\item QLineEdit.clear():清除QLinedit中的信息。
\end{itemize}
\textbf{QCheckBox}
QCheckBox主要是检查其勾选状态，或者连接改变状态触发事件，常用函数如下：
\begin{itemize}
	\item QCheckBox.stateChanged.connect(self.related\_function)  \# 将checkbox状态变化事件连接相应函数
		 
	\item QCheckbox.isChecked()  \# 检查checkbox是否被勾选
	\item QCheckbox.setCheckState(QtCore.Qt.Unchecked)  \# 将checkbox状态设置为未勾选状态,QtCore.Qt.Checked 为勾选状态
\end{itemize}
\textbf{QCombo box}\\*
获取Combo box选择信息的常用方法主要有两种，一种是获取选项的index一种是直接获取选项的文本。

\textbf{成员函数}
\begin{itemize}
\item currentIndex():获取当前选项的Index(int)
\item currentText():获取当前选项的文本(QString)
\end{itemize}
\textbf{QMovie}\\*
QMovie可将gif动态图在label中进行显示。
\begin{python}
	Movie = QMovie('time.gif')  # 载入Gif图，注意QMovie在PyQt5.QtCore内
	self.movie_label.setMovie(Movie)  # 将gif显示在gif中
	Movie.start()  # 启动gif
	Movie.stop()   # 停止gif

\end{python}
\textbf{QFileDialog}\\*
\textbf{成员函数}
\begin{itemize}
	\item getExistingDirectory(self,`打开目录对话框显示的信息`,"/defaultdir")
	\item getOpenFileName(self,"打开文件对话框显示信息","/defaltdir","Image Files (\*.jpg);;Text Files (\*.txt)"),使用两个分号用于过滤显示的文件。 
\end{itemize}
\textbf{QMessageBox}\\*
\begin{itemize}
	\item QMessageBox.information(self, 'Information', '提示消息')
	\item reply = QMessageBox.question(self,"question","选择是或否",QMessageBox.Yes | QMessageBox.No)
\end{itemize}
\textbf{QSlider}

QSlider控件提供一个垂直或者水平的滑动条，滑动条是一个用于控制有界值典型的控件，它允许用户沿水平或者垂直方向在某一范围内移动滑块，并将滑块所在的位置转换为一个合法范围内的整数值，有时候这中方式比输入数字或者使用SpinBox（计数器·）更加自然，在槽函数中对滑块所在位置的处理相当于从整数之间的最小值和最高值进行取值。
一个滑块条控件可以以垂直或者水平的方式显示，在构造函数中进行设置\begin{python}
	self.sp=QSlider(Qt.Horizontal)
	self.sp=Qslider(Qt.Vertical)
\end{python}
QSlider方法：
\begin{itemize}
	\item setMinimum():设置滑动条控件的最小值
	\item setMaximum():设置滑动条控件的最大值
	\item setSingleStep():设置滑动条控件的步长
	\item setValue():设置滑动条控件的值
	\item value():获取滑动条控件的值
	\item setTickInterval():设置刻度间隔
	\item setTickPosition():设置刻度标记的位置，可以输入一个枚举值，这个枚举值指定刻度线想当与滑块和用户操作的位置，以下是可以输入的枚举值：
    \begin{itemize}
    	\item QSlider.NoTicks:不绘制任何刻度线
    	\item QSlider.TicksBothSides：在滑块的两侧绘制刻度线
    	\item QSlider.TicksAbove:在滑块的（水平）上方绘制刻度线
    	\item QSlider.TicksBelow:在滑块的（水平）下方绘制刻度线
    	\item QSlider.TicksLeft:在滑块的（垂直）左侧绘制刻度线
    	\item QSlider.TicksRight,在滑块的（垂直）右侧绘制刻度线
    \end{itemize}
\end{itemize}
\begin{table}[H]
	\centering
	\begin{tabular}{cc}
		\toprule
		信号&描述\\
		\midrule
		vlaueChanged&	当滑块的值发生改变时发射此信号，此信号是最常用的\\
		sliderPressed&	当用户按下滑块时发射此信号\\
		sliderMoved&	当用户拖动滑块时发射此信号\\
		slierReleased&	当用户释放滑块时发射此信号\\
		\bottomrule
	\end{tabular}
\end{table}
\section{信号与槽}
\pythonfile{code/qwidget/ex1.py}
\begin{figure}[H]
	\centering
	\includegraphics[width=0.5\textwidth]{widget1}
	\caption{调用组件}
\end{figure}
自定义信号与槽的使用，是指在发射信号时，不使用窗口控件的函数，而是使用自定义的函数，（简单的说就是使用pyqtsSignal类实例发射信号），之所以要使用自定义的信号与槽，是因为通过内置函数发射信号有自身的缺陷，首先，内置函数只包含一些常用地信号，有些信号发射找不到对应的内置函数，其次在特定的情况下，才能发射此信号，如按钮的点击事件，最后，内置函数传递的参数是特定的，不可以自定义，使用自定义的信号与槽函数则没有这些缺陷

在pyqt5中，自定义信号与槽的适用很灵活，比如因为业务需要，在程序中的某些地方需要发射一个信号，传递多种数据，然后在槽函数接受这些数据，这样就可以很灵活的实现一些业务逻辑
\pythonfile{code/qwidget/ex2.py}
\begin{enumerate}
\item 生成一个信号：
	\pythonfile[firstline=4,lastline=7]{code/qwidget/ex2.py}
\item 将信号和槽函数连接起来：
	\pythonfile[firstline=30,lastline=31]{code/qwidget/ex2.py}
\item 槽函数接受数据：
	\pythonfile[firstline=23,lastline=24]{code/qwidget/ex2.py}
\item 发射信号的实现：
	\pythonfile[firstline=14,lastline=14]{code/qwidget/ex2.py}
\item 将信号绑定到槽对象中的槽函数上，所以槽函数能收到所发射的信号，自此，数据传递成功，就是这么简单，如果需要传递多个数据，可以自定义参数类型与数目
	\pythonfile[firstline=27,lastline=35]{code/qwidget/ex2.py}
\end{enumerate}
\pythonfile{code/pyqtsignal/ex1.py}
\begin{figure}[H]
	\centering
	\includegraphics[width=0.5\textwidth]{pyqtsignal}
	\caption{信号处理过程}
\end{figure}
\pythonfile{code/pyqtsignal/ex2.py}
自定义参数的传递。
在pyqt编程过程中，经常会遇到给槽函数传递自定义参数的情况，比如有一个信号与槽函数的连接是
\mint{python}{button.clicked.connect(show_page)}
我们知道对于clicked信号，它是没有参数的，对于show\_page函数来说，希望他可以接受参数，希望show\_page函数如下这样
\begin{python}
def show_page(self,name):
    print(name',点击了’)
\end{python}
    于是就会产生一个问题，信号发出的参数个数与槽函数接受的参数个数不一，那么如何解决这个问题呢，这里提供两种解决方法； 
    \begin{enumerate}
	    \item lamdba表达式 
	    \item 使用functools中的partial函数 
    \end{enumerate}
两种方法，下面均已写上，自己可运行查看，注意注释 
\pythonfile{code/pyqtsignal/ex3.py}
\textbf{多线程与槽}
实例如下
\pythonfile{code/pyqtsignal/ex4.py}
\textbf{主线程和子线程}

\begin{remark}
有时候在开发程序时会经常执行一些耗时的操作，这样就会导致界面卡顿，这也是多线程的应用范围之一，这样我们就可以创建多线程，使用主线程更新界面，使用子线程后台处理数据，最后将结果显示在界面上。
\end{remark}
\pythonfile{code/pyqtsignal/ex5.py}
